/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function (a, b) {
  let ans = "";
  let ca = 0;
  for (let i = a.length - 1, j = b.length - 1; i >= 0 || j >= 0; i--, j--) {
    let sum = ca;
    sum += i >= 0 ? parseInt(a[i]) : 0;
    sum += j >= 0 ? parseInt(b[j]) : 0;
    ans += sum % 2;
    ca = Math.floor(sum / 2);
  }
  ans += ca == 1 ? ca : "";
  return ans.split('').reverse().join('');
};


/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
/* 
要解决这个问题，我们需要将两个二进制字符串相加并返回结果。与十进制加法类似，二进制加法也需要逐位相加并处理进位，但进位规则更为简单（仅为 0 或 1）。

方法思路
对齐字符串：将两个二进制字符串按低位对齐，不足的高位补 0。
逐位相加：从最低位开始逐位相加，同时记录进位。
处理进位：每一位的和为 当前位a + 当前位b + 进位，可能的结果为 0、1、2、3，对应的进位分别为 0、0、1、1，当前位结果分别为 0、1、0、1。
处理最高位进位：如果最后还有进位，需要在结果前添加进位。
反转结果：由于计算是从低位到高位，结果需要反转以得到正确顺序。
*/
var addBinary = function (a, b) {
  let result = '';
  let carry = 0;
  let i = a.length - 1;
  let j = b.length - 1;

  // 从最低位开始逐位相加
  while (i >= 0 || j >= 0) {
    // 获取当前位的值，不足则补0
    const bitA = i >= 0 ? parseInt(a[i]) : 0;
    const bitB = j >= 0 ? parseInt(b[j]) : 0;

    // 计算当前位的和及进位
    const sum = bitA + bitB + carry;
    result += (sum % 2);  // 当前位的结果
    carry = Math.floor(sum / 2);  // 进位

    // 移动指针
    i--;
    j--;
  }

  // 处理最后的进位
  if (carry > 0) {
    result += carry;
  }

  // 反转结果字符串
  return result.split('').reverse().join('');
};